/* 启动聊天室服务端程序 */
const PORT = 3000

const app = require('express')()
const server = require('http').Server(app)
const io = require('socket.io')(server)
// 记录登录的用户
const users = []

server.listen(PORT, () => {
    console.log("服务已启动")
});

// express 处理静态资源，把public目录设置为静态资源目录
app.use(require("express").static("public"))

app.get("/", function(req, res){
    res.redirect("/index.html")
})

io.on('connection', function(socket) {

    // 监听登录消息
    socket.on("login", data => {
        // 判断用户名是否重复
        let user = users.find(item => item.username === data.username)
        if(user){
            socket.emit("loginError", {msg: "用户名重复"})
        }else{
            users.push(data)
            socket.emit("loginSuccess", data)
            // 广播：xxx加入了群聊  socketio提供了一个方法io.emit，如果是websocket就需要自己写一个broadcase方法
            io.emit("addUser", data)
            // 刷新当前群聊人数
            io.emit("userList", users)
            // 把登录成功的用户名和头像存储起来
            socket.username = data.username
            socket.avatar = data.avatar
        }
    })
    
    // 监听下线消息
    socket.on("disconnect", () => {
        // 把 users 中当前用户的信息删除掉
        // 广播：xxx离开了聊天室
        // 刷新左侧用户列表
        let idx = users.findIndex(item => item.username === socket.username)
        users.splice(idx, 1)
        io.emit("delUser", {
            username: socket.username,
            avatar: socket.avatar
        })
        io.emit("userList", users)
    })

    // 监听群聊消息
    socket.on("sendMessage", data => {
        console.log(data)
        // 广播给所有用户
        io.emit("receiveMessage", data)
    })

    // 监听私聊消息
    socket.on('sendMessageToOne', data => {
        console.log(data)
        var toSocket = null
        // 遍历已连接的socket
        for (const [socketId, onesocket] of io.of("/").sockets) {
            // 找到要私聊的用户
            if (onesocket.username === data.toName){
                toSocket = socketId
                break
            }
        }

        // const count = io.of("/").sockets.size;
        // console.log("当前在线人数是：" + count)

        if (toSocket) {
          // 发送给指定用户
          socket.to(toSocket).emit('receiveMessage', data)
          // 发送给自己
          socket.emit('receiveMessage', data)
        }
      })
});